﻿using Kvaser.CanLib;
using System;
using System.Threading;

namespace Zhaoxi.KvaserCommunication
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 托管/非托管
            // C# =》 C++ (非托管)  非托管(C++)的DLL要看是:32/64,非托管DLL是32位的,那么C#项目也要设置为32位,如果是64位的,那么C#项目也要设置为64位
            // 64位的DLL,访问32位的DLL,会有问题

            // 初始化
            Canlib.canInitializeLibrary();  // CreateFile
            // 打开通道
            // 参数1：can通道ID
            // 参数2:Canlib.canOPEN_ACCEPT_VIRTUAL这个是虚拟的can,如果是物理的Canlib还有很多值可选
            int handle = Canlib.canOpenChannel(0, Canlib.canOPEN_ACCEPT_VIRTUAL);
            // 可选动作:设置波特率
            // 参数1:can通道的句柄
            // 参数2:波特率值一秒钟要传输多少bit
            Canlib.canSetBitrate(handle, Canlib.canBITRATE_500K);
            // 打开总线
            Canlib.canBusOn(handle);
            // 发送数据
            // int handle, can通道
            // int id,  消息ID IDENTIFIER
            // byte[] msg, 消息内容
            // int dlc,  消息长度(data length code)
            // int flag,1:表示远程请求 2:表示包含11位ID的标准帧(Canlib.canMSG_STD),4:表示29位ID的扩展帧(Canlib.canMSG_EXT)
            byte[] msg = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
            // 发送
            //Canlib.canWrite(handle, 13, msg, 8, Canlib.canMSG_STD);  // 发送这里的13表示的是对方的ID  对方节点进行


            while (true)
            {
                Thread.Sleep(1);

                // 接收 - 指定(点对点),这里接收的是ID为12的消息,通过Kvaser Canking工具设置ID为12的节点发送过来的数据
                msg = new byte[8];
                // 接收数据的缓冲区重新初始化
                Canlib.canStatus status = Canlib.canReadSpecific(handle, 12, msg, out int dlc, out int flag, out long time);
                if (status == Canlib.canStatus.canOK)
                {
                    Console.WriteLine(string.Join(',', msg));
                }

                // 接收 - 广播
                // int handle,  can通道
                // out int id,  接收到的消息ID IDENTIFIER
                // byte[] msg,  接收到的消息内容(字节数组是引用类型直接传即可)
                // out int dlc, 接收到的消息长度(多少个字节)(data length code) 
                // out int flag,0：标准帧
                // out long time 时间戳
                //Canlib.canRead(handle, out int id, msg, out int dlc, out int flag, out long time);
            }

            // 对handle句柄进行关闭
            Canlib.canBusOff(handle);
            Canlib.canClose(handle);

            Console.ReadKey();
        }
    }
}
